package com.itcast.controller;
//三层架构
import com.itcast.annotation.Log;
import com.itcast.pojo.Dept;
import com.itcast.pojo.Result;
import com.itcast.service.DeptService;
import com.itcast.service.impl.DeptServiceImpl;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.List;
/*
    传参的三种方式
        1.路径传参 /depts/3         @pathvariable 获取路径参数                 /depts/{id}
        2.拼接参数  /depts?id=3     @RequestParam(可以省略) 形参名称和传参一致   /depts
        3.请求体传参(post常用) {"id":3}  @Requestbody 解析json数据              /depts
 */
@RestController//@controller+@responsebody 把响应的java对象或者是集合 封装成json对象或json数组
@RequestMapping("/depts")
@Slf4j
public class DeptController {
//    @Qualifier("deptServiceImpl")
//    @Autowired
    @Resource(name = "deptServiceImpl")
    private DeptService deptService = new DeptServiceImpl();

    //@RequestMapping 声明请求路径 写在方法上时 属性method 可以限制请求方式
    //@RequestMapping(value ="/depts",method= RequestMethod.POST)
    /**
     * 部门列表
     * @return
     * @throws IOException
     */
    @GetMapping
    public Result list() throws IOException {
        //1.调用service业务逻辑层的handleData方法
        List<Dept> deptList = deptService.handleData();
        log.info("查询所有部门{}",deptList);
        //2.响应json数据
        return  Result.success(deptList);
    }

    /**
     * 删除部门
     * @param id
     * @return
     */
    @Log
    @DeleteMapping
    public Result delete(Integer id){
    /* 方案一：通过原始的 HttpServletRequest 对象获取请求参数
        @DeleteMapping("/depts")
        public Result delete(HttpServletRequest request){
            String idStr = request.getParameter("id");
            int id = Integer.parseInt(idStr);
            System.out.println("根据ID删除部门: " + id);
            return Result.success();
        }

        方案二：通过Spring提供的 @RequestParam 注解，将请求参数绑定给方法形参
        @DeleteMapping("/depts")
        public Result delete(@RequestParam("id") Integer deptId){
        //@RequestParam 注解的value属性，需要与前端传递的参数名保持一致 。
            System.out.println("根据ID删除部门: " + deptId);
            return Result.success();
        }
     */

    //方案三：如果请求参数名与形参变量名相同，直接定义方法形参即可接收。（省略@RequestParam）
        //1.接收请求参数
        //2.调用service层
        log.info("删除部门{}",id);
        deptService.delete(id);
        //3.响应结果
        return Result.success();
    }

    /**
     * 新增部门
     * @param dept
     * @return
     */
    @Log
    @PostMapping
    public Result add(@RequestBody Dept dept){
        log.info("新增部门{}",dept);
        //1.接收请求参数 @RequestBody
        //2.调用service层
        deptService.add(dept);
        //3.响应结果
        return Result.success();
    }

    /**
     * 根据id查找
      * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id){
        log.info("根据id查找部门{}",id);
        //System.out.println(id);
        Dept dept = deptService.getById(id);
        return Result.success(dept);
    }

    /**
     * 修改部门
     * @param dept
     * @return
     */
    @Log
    @PutMapping
    public Result update(@RequestBody Dept dept){
        log.info("修改部门{}",dept);
        deptService.update(dept);
        return Result.success();

    }

 }
